/* ***** BEGIN LICENSE BLOCK *****
 *   Version: MPL 1.1/GPL 2.0/LGPL 2.1
 *
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 * 
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * The Original Code is JsWs.
 *
 * The Initial Developer of the Original Code is
 * Chris Winberry.
 * Portions created by the Initial Developer are Copyright (C) 2007
 * the Initial Developer. All Rights Reserved.
 *
 * Contributor(s):
 *
 * Alternatively, the contents of this file may be used under the terms of
 * either the GNU General Public License Version 2 or later (the "GPL"), or
 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 * in which case the provisions of the GPL or the LGPL are applicable instead
 * of those above. If you wish to allow use of your version of this file only
 * under the terms of either the GPL or the LGPL, and not to allow others to
 * use your version of this file under the terms of the MPL, indicate your
 * decision by deleting the provisions above and replace them with the notice
 * and other provisions required by the GPL or the LGPL. If you do not delete
 * the provisions above, a recipient may use your version of this file under
 * the terms of any one of the MPL, the GPL or the LGPL.
 * 
 * ***** END LICENSE BLOCK ***** */


/**
 * @class Provides utilities and context to dynamic webpages
 * @constructor
 * @param {JsWsConnectionHandler} server JsWs server object
 * @param {VirtualPath|String} sPath Location of the currently executing script
 * @exception ExParamError
 */
function ScriptContext (server, path) {
	if ((typeof path == "string") || (path instanceof String))
		path = new VirtualPath(path);
	if (!(path instanceof VirtualPath))
		throw(new ExParamError("Parameter \"path\" is of an unexpected type (" + typeof path + ")", 0, null, arguments));

	/** @private */
	this.server = server;

	/**
	 * Path to the requested webpage
	 * @type nsILocalFile
	 */
	this.path = path;

	/**
	 * Path to the folder containing the requested webpage
	 * @type nsILocalFile
	 */
	this.root = null;
	var fullPath = this.mapPath(this.path);
	//if (fullPath.exists()) {
	if (fullPath.exists())
		if (fullPath.isDirectory())
			//var tmpPath = this.path.clone();
			//this.server.tools.appendPath(tmpPath, "index." + JSWS_SCRIPT_FILEEXT);
			//if (tmpPath.exists() && tmpPath.isFile()) {
			//	this.path = tmpPath;
			//}
			//this.root = this.path.clone();
			this.root = this.path;
		else
			this.root = this.path.parent();
	//}
	else
		this.root = this.path.parent();

	var script = this;
	/** @private */
	this.VirtualPath = function (path) {
		if (path.match(/^\/|\\/))
			script.VirtualPath.baseConstructor.call(this, path);
		else {
			script.VirtualPath.baseConstructor.call(this, script.root.path);
			this.append(path);
		}
	}
	SubClass(VirtualPath, script.VirtualPath);
}

/**
 * Runs cleanup on internal objects
 */
ScriptContext.prototype.destroy = function () {
	this.server = null;
	this.path = null;
	this.root = null;
}

/**
 * Calculates an absolute path. The passed-in path is treated as relative to server's
 *  document root if the path begins with a "/". It is treated as relative to the
 *  executing script if the path does not begin with a "/".
 * @param {String} path Path to resolve to an absolute path
 * @returns Full path to in the context of the local filesystem
 * @type nsILocalFile
 * @exception ExParamError
 */
ScriptContext.prototype.mapPath = function (path) {
	if ((typeof path == "string") || (path instanceof String)) {
		if (path.match(/^\/|\\/))
			path = new VirtualPath(path);
		else {
			var tmp = new VirtualPath(this.root);
			tmp.append(path);
			path = tmp;
		}
	}
	if (!(path instanceof VirtualPath))
		throw(new ExParamError("Parameter \"path\" is of an unexpected type (" + typeof path + ")", 0, null, arguments));

	var mappedModule = this.server.mapModule(path);
	var finalPath = mappedModule.extensionPath
		+ VirtualPath.sysSeparator
		+ VirtualPath.sysNrml(mappedModule.contentPath)
		+ VirtualPath.sysSeparator
		+ VirtualPath.sysNrml(path.path.substring(mappedModule.virtualPath.length, path.path.length))
		;
	
	var oFile = Cc["@mozilla.org/file/local;1"].
		createInstance(Ci.nsILocalFile);
	try {
		oFile.initWithPath(finalPath);
	} catch (e) { JsWs.log(e + "\n" + finalPath); }

	return(oFile);
}

